#pragma once
#include "Node.h"
#include "Lexer"
#include "PrologException.h"
#include <map>

enum DataType
{
	REAL, INTEGER, STRING, SYMBOL, CHARACTER, UNKNOWN
};

class Variable;
class Predicate : public Node
{
public:
	Predicate(std::string, unsigned int, Node *);
	~Predicate(void);
	int getType() const;
	void addDataType(DataType);
	void addDataTypes(quex::Lexer** qlex) throw (PrologException);
	void addArguments(quex::Lexer** qlex, Node* predicate, std::vector<Variables>* vars) throw (PrologException);
	DataType getDataType(int) const;
	void addArguments(quex::Lexer** qlex, Node* predicate) throw (PrologException);
	void clone(Node**);
	void print (std::string&);
	vector<DataType> getDataTypeVector() const;
	bool checkNode(std::vector<Variables> &, const Node*);
	std::string getValue(std::vector<Variables>);
private:
	std::vector<DataType> _dataType;
};

